#!/bin/bash
##该脚本用于 NGINX 日志切割、压缩
##首先，使用 locate 命令查找 nginx 命令所在位置，因为各个服务器 nginx 安装路径、版本可能不同
##其次，将日志文件 mv 到新目录
##最后，根据日志文件名创建对应的子目录，将日志压缩至对应目录

which locate
if [ $? -ne 0 ];then
    #安装 locate 本地索引查找工具
    yum -y install mlocate
    #更新索引库
    updatedb
fi
 
nginx_app=`locate "sbin/nginx" | grep "nginx$"`
logs_dir=/var/log/nginx
bak_dir=/var/log/nginxbak
log_date=`date +%Y%m%d -d "1 day ago"`

if [ ! -d "$bak_dir" ]
then
    mkdir $bak_dir
fi
#将日志移动到备份目录
/bin/mv $logs_dir/*.log $bak_dir
#重建 NGINX 日志
$nginx_app -s reopen

#日志打包压缩
cd $bak_dir
#根据文件名创建对应的项目目录
#1、将文件名存入数组
files=(`ls *.log`)
#2、根据数组内容创建对应的项目目录
for file in ${files[@]}
do
    #数组中每个元素都是以”.log“结尾的文件名，创建目录时需要将结尾去掉。
    #echo ${file%.*} 用途是从右至左删除，直到第一个”.”符号，连同“.”一并删除
    subject_dir=`echo ${file%.*}`
    if [ ! -d "$subject_dir" ]
    then
        mkdir $subject_dir
    fi
    #3、将日志源文件压缩至对应的项目目录
    /bin/tar czf $subject_dir/$log_date.tgz $file
    if [ $? -eq 0 ]
    then
        #删除旧的源文件
        rm -f $file
    else
        echo "`date` $file备份压缩失败……" >> $subject_dir/error.log
    fi
    #4、删除旧的日志文件
    old_date=`date +%Y%m%d -d "30 days ago"`
    rm -f $subject_dir/$old_date.tgz
done
